]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell/perf-helper: Use custom widget as content
authorFlorian Müllner <fmuellner@gnome.org>
Mon, 17 Apr 2023 23:52:26 +0000 (01:52 +0200)
committerMarge Bot <marge-bot@gnome.org>
Wed, 7 Jun 2023 11:12:40 +0000 (11:12 +0000)
The windows we create use a simple pattern as content, as that's
easier to follow than completely empty windows. GTK4 no longer
allows hooking into the drawing of arbitrary widgets, so prepare
for that by using a dedicated subclass instead of a signal handler.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2733>

src/shell-perf-helper.c

index 29f12a019a524d4acd5029bccc7b9e14edf739e5..6a748e67e4aa9877f2f08bcb273a4bf6e1a05baa 100644 (file)
@@ -63,16 +63,26 @@ G_DECLARE_FINAL_TYPE (PerfHelperWindow, perf_helper_window, PERF_HELPER, WINDOW,
 struct _PerfHelperWindow {
   GtkApplicationWindow parent;
 
-  guint redraws : 1;
   guint mapped : 1;
   guint exposed : 1;
   guint pending : 1;
+};
+
+G_DEFINE_TYPE (PerfHelperWindow, perf_helper_window, GTK_TYPE_APPLICATION_WINDOW);
+
+#define PERF_HELPER_TYPE_WINDOW_CONTENT (perf_helper_window_content_get_type ())
+G_DECLARE_FINAL_TYPE (PerfHelperWindowContent, perf_helper_window_content, PERF_HELPER, WINDOW_CONTENT, GtkBox)
+
+struct _PerfHelperWindowContent {
+  GtkBox parent;
+
+  guint redraws : 1;
 
   gint64 start_time;
   gint64 time;
 };
 
-G_DEFINE_TYPE (PerfHelperWindow, perf_helper_window, GTK_TYPE_APPLICATION_WINDOW);
+G_DEFINE_TYPE (PerfHelperWindowContent, perf_helper_window_content, GTK_TYPE_BOX);
 
 static void destroy_windows           (PerfHelperApp *app);
 static void finish_wait_windows       (PerfHelperApp *app);
@@ -154,16 +164,14 @@ perf_helper_window_draw (GtkWidget  *widget,
 }
 
 static gboolean
-on_child_draw (GtkWidget  *widget,
-               cairo_t    *cr,
-               gpointer    user_data)
+perf_helper_window_content_draw (GtkWidget  *widget,
+                                 cairo_t    *cr)
 {
-  PerfHelperWindow *window;
+  PerfHelperWindowContent *content = PERF_HELPER_WINDOW_CONTENT (widget);
+  GtkWindow *window = GTK_WINDOW (gtk_widget_get_toplevel (widget));
   cairo_rectangle_int_t allocation;
   double x_offset, y_offset;
 
-  window = PERF_HELPER_WINDOW (gtk_widget_get_toplevel (widget));
-
   gtk_widget_get_allocation (widget, &allocation);
 
   /* We draw an arbitrary pattern of red lines near the border of the
@@ -171,9 +179,9 @@ on_child_draw (GtkWidget  *widget,
    * is drastrically wrong.
    */
 
-  if (window->redraws)
+  if (content->redraws)
     {
-      double position = (window->time - window->start_time) / 1000000.;
+      double position = (content->time - content->start_time) / 1000000.;
       x_offset = 20 * cos (2 * M_PI * position);
       y_offset = 20 * sin (2 * M_PI * position);
     }
@@ -202,18 +210,37 @@ tick_callback (GtkWidget     *widget,
                GdkFrameClock *frame_clock,
                gpointer       user_data)
 {
-  PerfHelperWindow *window = PERF_HELPER_WINDOW (widget);
+  PerfHelperWindowContent *content = user_data;
 
-  if (window->start_time < 0)
-    window->start_time = window->time = gdk_frame_clock_get_frame_time (frame_clock);
+  if (content->start_time < 0)
+    content->start_time = content->time = gdk_frame_clock_get_frame_time (frame_clock);
   else
-    window->time = gdk_frame_clock_get_frame_time (frame_clock);
+    content->time = gdk_frame_clock_get_frame_time (frame_clock);
 
   gtk_widget_queue_draw (widget);
 
   return TRUE;
 }
 
+static GtkWidget *
+perf_helper_window_content_new (gboolean redraws) {
+  PerfHelperWindowContent *content;
+  GtkWidget *widget;
+
+  content = g_object_new (PERF_HELPER_TYPE_WINDOW_CONTENT,
+                          "visible", TRUE,
+                          NULL);
+
+  content->redraws = redraws;
+
+  widget = GTK_WIDGET (content);
+
+  if (redraws)
+    gtk_widget_add_tick_callback (widget, tick_callback, content, NULL);
+
+  return widget;
+}
+
 static void
 create_window (PerfHelperApp *app,
                int            width,
@@ -230,7 +257,6 @@ create_window (PerfHelperApp *app,
                          "application", app,
                          NULL);
 
-  window->redraws = redraws;
   if (alpha)
     gtk_widget_set_visual (GTK_WIDGET (window), gdk_screen_get_rgba_visual (gdk_screen_get_default ()));
   if (maximized)
@@ -245,18 +271,13 @@ create_window (PerfHelperApp *app,
     {
       gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (window)),
                                    alpha ? "alpha" : "solid");
-      child = g_object_new (GTK_TYPE_BOX, "visible", TRUE, NULL);
-
-      g_signal_connect (child, "draw", G_CALLBACK (on_child_draw), NULL);
+      child = perf_helper_window_content_new (redraws);
     }
 
   gtk_container_add (GTK_CONTAINER (window), child);
 
   gtk_widget_set_size_request (GTK_WIDGET (window), width, height);
   gtk_widget_show (GTK_WIDGET (window));
-
-  if (redraws)
-    gtk_widget_add_tick_callback (GTK_WIDGET (window), tick_callback, NULL, NULL);
 }
 
 static void
@@ -396,6 +417,19 @@ perf_helper_app_class_init (PerfHelperAppClass *klass)
   gapp_class->dbus_register = perf_helper_app_dbus_register;
 }
 
+static void
+perf_helper_window_content_init (PerfHelperWindowContent *content)
+{
+  content->start_time = -1;
+}
+
+static void
+perf_helper_window_content_class_init (PerfHelperWindowContentClass *klass) {
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  widget_class->draw = perf_helper_window_content_draw;
+}
+
 static PerfHelperApp *
 perf_helper_app_new (void) {
   GApplicationFlags flags = G_APPLICATION_IS_SERVICE |
@@ -412,7 +446,6 @@ static void
 perf_helper_window_init (PerfHelperWindow *window)
 {
   window->pending = TRUE;
-  window->start_time = -1;
 }
 
 static void